SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
create procedure [dbo].[SP_TCFACT_CAMB_Q02]
/*--------------------------------------------------------------------------*/
/*---- Empresa		   : OFISIS S.A					----*/
/*---- Cliente		   : OFISIS S.A					----*/
/*---- Sistema		   : Recursos Humanos				----*/
/*---- Modulo		   : Cuenta Corriente				----*/
/*---- Programa		   : Convierte Montos de una Moneda a otra	----*/
/*---- Script		   : TMCTA_CTE.SQL				----*/
/*---- Nombre SP	   : SP_TCFACT_CAMB_Q01				----*/
/*---- Desarrollado por	   : JDG 					----*/
/*---- Fecha Creacion	   : 27/11/2001					----*/
/*---- Base de Datos	   : SQL					----*/
/*---- Version		   : 7.0					----*/
/*---- Invoca a SP 	   :						----*/
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/*---- Comentarios         : Convierte un importe de una moneda a otra	----*/
/*---- Drop Procedure  SP_TCFACT_CAMB_Q01             			----*/
/*---- Grant Execute on SP_TCFACT_CAMB_Q01 to public           			----*/
/*---- 									----*/
/*--------------------------------------------------------------------------*/
/*---Modificado 1 por     :REYNALDO MENACHO l.       			  --*/
/*---Fecha Modificaci÷n   :04/04/2002                 			  --*/ 
/*---Detalle Modificaci÷n :Opci¸n de Tipo de Cambio dado por usuario      --*/
/*--------------------------------------------------------------------------*/
/*---- Declare  @PRUEBA TD_NU_016_004
       Exec SP_TCFACT_CAMB_Q01 '01', 'SOL','EUR','2001/11/05', 401.20,'C','O', 'N', 3.50, @PRUEBA out
       Select @PRUEBA							---*/
/*---- 									----*/
/*--------------------------------------------------------------------------*/

 @ISCO_EMPR        	TD_VC_002, 	-- C½digo Empresa
 @ISCO_MONE_ORIG	TD_VC_003, 	-- Moneda Origen
 @ISCO_MONE_BASE	TD_VC_003, 	-- Moneda Destino
 @IDFE_BUSQ		TD_DT_001, 	-- Fecha de Operaci½n (para buscar el tipo de cambio)
 @INIM_BASE		TD_NU_016_004,	-- Importe a Convertir
 @ISST_COMP_VNTA	TD_VC_001, 	-- Tipo de Cambio Compra o Venta
 @ISTI_CAMB		TD_VC_001,	-- Tipo de Cambio Oficial o Mercado
 @ISST_USUA		TD_VC_001,	-- Estatus Tipo de Cambio Predefinido
 @INFA_USUA		TD_NU_015_006,	-- Tipo de Cambio Predefinido por Usuario
 @ONIM_DEST		TD_NU_016_004 OUTPUT	-- Importe Convertido
	As
Declare 
 @VNFA_CAMB		Numeric(15,6),
 @VNNU_FACT_CAMB	TD_IN_001,
 @VNIM_DEST		TD_NU_016_004,
 @VSCA_CAMB_BUSQ	TD_VC_020,   
 @VSFE_BUSQ		TD_VC_020,
 @VSCO_MONE_CAMI	TD_VC_003,   
 @VSCO_MONE_NACI	TD_VC_003,   
 @VSCO_MONE_EXTR	TD_VC_003,   
 @VNFA_CAMB_CAM1	numeric(15,6),
 @VNFA_CAMB_CAM2	numeric(15,6),
 @VSNU_MONE             TD_VC_002

Create Table #TCFACT_CAMB_Q01_1 (
    CO_MONE        varchar(3)       NULL, 
    CO_MONE_BASE   varchar(3)       NULL,
    FA_CAMB        numeric(15,6)    )

/*Select @VSCO_MONE_NACI = CO_MONE_DEFA, @VSCO_MONE_EXTR = CO_MONE_EXTR
From TMPARA_TESO
WHERE CO_EMPR = @ISCO_EMPR

Select @VSNU_MONE = LTRIM(RTRIM(STR(COUNT(DISTINCT CO_MONE) - 1)))
From TCFACT_CAMB
*/
  /*------------------------------------------------------------------------*/
  /*----------------- Inicializa las variables de Trabajo ------------------*/
  /*------------------------------------------------------------------------*/
   Select @VNFA_CAMB = 0
   Select @ONIM_DEST = 0
   Select @VSFE_BUSQ = convert(varchar(10), @IDFE_BUSQ , 120)

  /*------------------------------------------------------------------------*/
  /*------ Determina si el factor de cambio elegido es Compra o Venta ------*/
  /*------------------------------------------------------------------------*/
  If @ISST_COMP_VNTA = 'C'
    Begin
	Select @VSCA_CAMB_BUSQ = 'FA_CMPR_'
    End
  Else
    Begin
	Select @VSCA_CAMB_BUSQ = 'FA_VNTA_'
    End

  /*------------------------------------------------------------------------*/
  /*--------- Determina el tipo de cambio a usar Oficial o Mercado ---------*/
  /*------------------------------------------------------------------------*/
  If @ISTI_CAMB = 'O'
    Begin
	Select @VSCA_CAMB_BUSQ = rtrim( @VSCA_CAMB_BUSQ ) + ltrim( 'OFIC' )
    End
  Else
    Begin
	Select @VSCA_CAMB_BUSQ = rtrim( @VSCA_CAMB_BUSQ ) + ltrim( 'MERC' )
    End

  /*------------------------------------------------------------------------*/
  /*------- Caso 1 : 	 					    --------*/
  /*------- En caso de que la Moneda Base y la Destino sean Iguales --------*/
  /*------------------------------------------------------------------------*/
  If @ISCO_MONE_BASE = @ISCO_MONE_ORIG
    Begin
	Select @VNFA_CAMB = 1
    End

  /*------------------------------------------------------------------------*/
  /*------- Caso 2 : 	 					    --------*/
  /*-------	      Se busca un Factor de Cambio Directo          --------*/
  /*------------------------------------------------------------------------*/
  If @VNFA_CAMB = 0
    Begin
      Delete From #TCFACT_CAMB_Q01_1 
      EXEC(' Insert into #TCFACT_CAMB_Q01_1 (CO_MONE, CO_MONE_BASE, FA_CAMB) '
                        +' Select Top 1 CO_MONE, CO_MONE_BASE, ' + @VSCA_CAMB_BUSQ 
			+' From TCFACT_CAMB '
			+' Where CO_MONE	 = "' + @ISCO_MONE_ORIG + '" '
			+' And	 CO_MONE_BASE	 = "' + @ISCO_MONE_BASE + '" '
			+' And	 FE_CAMB	<= "' + @VSFE_BUSQ + '" '
			+' Order By FE_CAMB Desc  ' )
      Select @VNNU_FACT_CAMB = ( Select count(*) From #TCFACT_CAMB_Q01_1 )
      If @VNNU_FACT_CAMB > 0
         Begin
	    Select @VNFA_CAMB = ( Select PATINDEX (@ISST_USUA, 'S') * @INFA_USUA +
                                         PATINDEX (@ISST_USUA, 'N') * FA_CAMB 
                                  From #TCFACT_CAMB_Q01_1 ) /*--Factor Cambio Directo--*/
	 End
    End

  /*------------------------------------------------------------------------*/
  /*------- Caso 3 : 	 					    --------*/
  /*-------	      Se busca un Factor de Cambio Inverso          --------*/
  /*------------------------------------------------------------------------*/
  If @VNFA_CAMB = 0
    Begin
      Delete From #TCFACT_CAMB_Q01_1 
      EXEC(' Insert into #TCFACT_CAMB_Q01_1 (CO_MONE, CO_MONE_BASE, FA_CAMB) '
                        +' Select Top 1 CO_MONE, CO_MONE_BASE, ' + @VSCA_CAMB_BUSQ 
			+' From TCFACT_CAMB '
			+' Where CO_MONE	 = "' + @ISCO_MONE_BASE + '" ' 
			+' And	 CO_MONE_BASE	 = "' + @ISCO_MONE_ORIG + '" '
			+' And	 FE_CAMB	<= "' + @VSFE_BUSQ + '" ' + ' Order By FE_CAMB Desc  ' )
      Select @VNNU_FACT_CAMB = ( Select count(*) From #TCFACT_CAMB_Q01_1 )
      If @VNNU_FACT_CAMB > 0
         Begin
	    Select @VNFA_CAMB = ( Select PATINDEX (@ISST_USUA, 'S') * @INFA_USUA +
                                         PATINDEX (@ISST_USUA, 'N') * FA_CAMB 
                                  From #TCFACT_CAMB_Q01_1 ) 
	    If @VNFA_CAMB > 0
		Select @VNFA_CAMB = (1/@VNFA_CAMB)/*--Factor Cambio Inverso--*/
	    Else
		Select @VNFA_CAMB = 0
	 End
    End

 

  /*------------------------------------------------------------------------*/
  /*------- Caso 4 : 	 					    --------*/
  /*-------	Se busca un Camino entre los Factores de Cambio     --------*/
  /*------------------------------------------------------------------------*/
  If @VNFA_CAMB = 0
    Begin
      ---- Obtiene una moneda comun a los dos factores de cambio ----
      Select @VSCO_MONE_CAMI =  ( Select Top 1 t1.MONEDA From 
				      ( Select Distinct CO_MONE MONEDA From TCFACT_CAMB Where CO_MONE_BASE = @ISCO_MONE_BASE
					 UNION
				        Select Distinct CO_MONE_BASE MONEDA From TCFACT_CAMB Where CO_MONE = @ISCO_MONE_BASE ) t1, 
				      ( Select Distinct CO_MONE MONEDA From TCFACT_CAMB Where CO_MONE_BASE = @ISCO_MONE_ORIG
					 UNION
				        Select Distinct CO_MONE_BASE MONEDA From TCFACT_CAMB Where CO_MONE = @ISCO_MONE_ORIG ) t2
				  Where t2.MONEDA = t1.MONEDA )
      If @VSCO_MONE_CAMI is not Null
	 Begin
	    ------------------------------------------------------------------------
	    ---- Primer Paso :                                                  ----
	    ---- Se Halla Factor de Cambio de la Moneda Base a la Moneda Camino ----
	    ------------------------------------------------------------------------
	    Select @VNFA_CAMB_CAM1 = 0
	    --************************************************************************--
	    -------            Se busca un Factor de Cambio Directo         --------
	    --************************************************************************--
	    If @VNFA_CAMB_CAM1 = 0
		Begin
		   Delete From #TCFACT_CAMB_Q01_1 
		   EXEC(' Insert into #TCFACT_CAMB_Q01_1 Select Top 1 CO_MONE, CO_MONE_BASE, ' + @VSCA_CAMB_BUSQ 
			+' From TCFACT_CAMB '
			+' Where CO_MONE	 = "' + @VSCO_MONE_CAMI + '" ' 
			+' And	 CO_MONE_BASE	 = "' + @ISCO_MONE_BASE + '" '
			+' And	 FE_CAMB	<= "' + @VSFE_BUSQ + '" '
			+' Order By FE_CAMB Desc  ' )
		   Select @VNNU_FACT_CAMB = ( Select count(*) From #TCFACT_CAMB_Q01_1 )
		   If @VNNU_FACT_CAMB > 0
		      Begin
			Select @VNFA_CAMB_CAM1 = ( Select (PATINDEX (@ISST_USUA, 'S') * @INFA_USUA +
                                                   PATINDEX (@ISST_USUA, 'N') * FA_CAMB) 
						   From #TCFACT_CAMB_Q01_1 ) --Factor Cambio Directo--
		      End
		End
	    --************************************************************************--
	    -------	      Se busca un Factor de Cambio Inverso            --------
	    --************************************************************************--
	    If @VNFA_CAMB_CAM1 = 0
		Begin
		   Delete From #TCFACT_CAMB_Q01_1 
		   EXEC(' Insert into #TCFACT_CAMB_Q01_1 Select Top 1 CO_MONE, CO_MONE_BASE, ' + @VSCA_CAMB_BUSQ 
			+' From TCFACT_CAMB '
			+' Where CO_MONE	 = "' + @ISCO_MONE_BASE + '" ' 
			+' And	 CO_MONE_BASE	 = "' + @VSCO_MONE_CAMI + '" '
			+' And	 FE_CAMB	<= "' + @VSFE_BUSQ + '" '
			+' Order By FE_CAMB Desc  ' )
		   Select @VNNU_FACT_CAMB = ( Select count(*) From #TCFACT_CAMB_Q01_1 )
		   If @VNNU_FACT_CAMB > 0
		      Begin
			Select @VNFA_CAMB_CAM1 = ( Select (PATINDEX (@ISST_USUA, 'S') * @INFA_USUA +
                                                   PATINDEX (@ISST_USUA, 'N') * FA_CAMB) 
						   From #TCFACT_CAMB_Q01_1 ) 
			If @VNFA_CAMB_CAM1 > 0
			   Select @VNFA_CAMB_CAM1 = (1/@VNFA_CAMB_CAM1) --Factor Cambio Inverso--
			Else
			   Select @VNFA_CAMB_CAM1 = 0
		      End
		End
	    --************************************************************************--

	    ------------------------------------------------------------------------
	    ---- Segundo Paso :                                                 ----
	    ---- Se Halla Factor Cambio de la Moneda Camino a la Moneda Destino ----
	    ------------------------------------------------------------------------
	    Select @VNFA_CAMB_CAM2 = 0
	    --************************************************************************--
	    -------            Se busca un Factor de Cambio Directo         --------
	    --************************************************************************--
	    If @VNFA_CAMB_CAM2 = 0
		Begin
		   Delete From #TCFACT_CAMB_Q01_1 
		   EXEC(' Insert into #TCFACT_CAMB_Q01_1 Select Top 1 CO_MONE, CO_MONE_BASE, ' + @VSCA_CAMB_BUSQ 
			+' From TCFACT_CAMB '
			+' Where CO_MONE	 = "' + @ISCO_MONE_ORIG + '" ' 
			+' And	 CO_MONE_BASE	 = "' + @VSCO_MONE_CAMI + '" '
			+' And	 FE_CAMB	<= "' + @VSFE_BUSQ + '" '
			+' Order By FE_CAMB Desc  ' )
		   Select @VNNU_FACT_CAMB = ( Select count(*) From #TCFACT_CAMB_Q01_1 )
		   If @VNNU_FACT_CAMB > 0
		      Begin
			Select @VNFA_CAMB_CAM2 = ( Select FA_CAMB From #TCFACT_CAMB_Q01_1 ) --Factor Cambio Directo--
		      End
		End
	    --************************************************************************--
	    -------	      Se busca un Factor de Cambio Inverso            --------
	    --************************************************************************--
	 If @VNFA_CAMB_CAM2 = 0
		Begin
		   Delete From #TCFACT_CAMB_Q01_1 
		   EXEC(' Insert into #TCFACT_CAMB_Q01_1 Select Top 1 CO_MONE, CO_MONE_BASE, ' + @VSCA_CAMB_BUSQ 
			+' From TCFACT_CAMB '
			+' Where CO_MONE	 = "' + @VSCO_MONE_CAMI + '" ' 
			+' And	 CO_MONE_BASE	 = "' + @ISCO_MONE_ORIG + '" '
			+' And	 FE_CAMB	<= "' + @VSFE_BUSQ + '" '

			+' Order By FE_CAMB Desc  ' )
		   Select @VNNU_FACT_CAMB = ( Select count(*) From #TCFACT_CAMB_Q01_1 )
		   If @VNNU_FACT_CAMB > 0
		      Begin
			Select @VNFA_CAMB_CAM2 = ( Select FA_CAMB From #TCFACT_CAMB_Q01_1 ) 
			If @VNFA_CAMB_CAM2 > 0
			   Select @VNFA_CAMB_CAM2 = (1/@VNFA_CAMB_CAM2)  --Factor Cambio Inverso--
			Else
			   Select @VNFA_CAMB_CAM2 = 0
		      End
		End
	    --************************************************************************--
	    ------------------------------------------------------------------------
	    ---- Tercer Paso :                                                  ----
	    ---- Se combinan ambos Factores de Cambio para la conversion        ----
	    ------------------------------------------------------------------------
	    Select @VNFA_CAMB = @VNFA_CAMB_CAM1 * @VNFA_CAMB_CAM2
	 End
    End
  ------------------------------------------------------------------------

  Select @ONIM_DEST = @VNFA_CAMB * @INIM_BASE

 Return

/*-------------------------------------- FIN -----------------------------------------------*/


GO
